package model;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//封装 DBUtil 时,封装数据库定义与本地 MySQL 进行连接,然后定义 connection 进行连接,连接之后进行关闭数据库操作

//  jdbc 编程的基本操作步骤
//  首先建立 model 包进行管理数据库有关的数据
//  在 model 包中建立有关的数据库连接以及操作数据库的 DBUtil 类
//  数据库文件属于 属于类加载时一并加载的文件 所以使用 static 进行修饰,如果只在此类中使用 则用 private 进行修饰,如果要在
//  其他的类中使用采用 public 进行修饰.最终不变的数据 再使用 final 进行修饰
//   public 修饰在程序中的使用范围, static 修饰程序加载启动时是否加载  final 定义变量或者方法是否可变
public class DBUtil {
  //  连接数据库 数据库连接只在此类中进行操作且不进行其他操作 所以定义为 public static final 定义常量
    public static final String URL="jdbc:mysql://127.0.0.1:3306/ordersystem?characterEncoding=utf-8&useSSL=false";
    public static final String USERNAME="root";
    public static final String PASSWORD="123123";
    //根据 sql 接口实现数据库的定义连接
    private static volatile DataSource dataSource = null;
    // DBUtil 本质上是管理了一个单例的 Datasource 类   数据 data   日期  date
    //构造函数,构造 MysqlDatasource
    public static DataSource getDataSource(){
        if(dataSource==null){
            synchronized (DBUtil.class){
                if (dataSource==null) {
                    dataSource = new MysqlDataSource();
                    ((MysqlDataSource)dataSource).setURL(URL);
                    ((MysqlDataSource)dataSource).setUser(USERNAME);
                    ((MysqlDataSource)dataSource).setPassword(PASSWORD);
                }
            }
        }
        return dataSource;
    }
    // 建立数据库连接 连接一定选用 Java.sql 进行数据库的连接
    // 数据库连接失败是很常见的问题,如果失败,后续的操作肯定也是失败的
    // 如果发现 content 为 null 就说明数据库连接失败, 就需要查看错误信息, tomcat 上面的日志信息,
    // 常见的问题就是 url password username 等信息填写错了,或者数据库没有启动.

    public static Connection getConnection()  {
        try {
            //此处返回说明是 数据库连接成功,已连接到数据库
            return getDataSource().getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        System.out.println("数据库连接失败,请检查数据库是否正确启动,并检查对应 url 或者 password");
        return null;
    }

    //建立连接之后关闭资源 connection 连接, statement 语句 resultSet 结果.关闭顺序与创建顺序正好相反
    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){

            try {
                if(resultSet!=null) {
                    resultSet.close();
                }
                if (statement == null) {
                        statement.close();
                    }
                if (connection == null) {
                        connection.close();
                    }

            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
    }
}
